package org.example.seri

import java.io.ByteArrayOutputStream
import java.util.zip.GZIPOutputStream
import java.util.zip.GZIPInputStream
import java.io.ByteArrayInputStream
import kotlin.system.measureTimeMillis

class GzipTest {
    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            val test = GzipTest()
            test.runGzipTest()
        }
    }

    fun runGzipTest() {
        val testData = "这是一个用于测试的示例数据，它包含了一些中文字符和英文字符，以及一些特殊符号！This is a sample data for testing, which contains Chinese characters, English characters and special symbols! @#$%^&*()".repeat(10)
        println("原始数据大小: ${testData.toByteArray().size} 字节")

        val iterations = 100000
        println("开始执行 $iterations 次 Gzip 压缩/解压缩测试...")

        val totalTime = measureTimeMillis {
            for (i in 1..iterations) {
                // 执行压缩
                val compressedData = compress(testData.toByteArray())

                // 执行解压缩
                val decompressedData = decompress(compressedData)

                // 验证数据一致性（仅在少数情况下打印，避免输出过多）
                if (i % 10000 == 0) {
                    val result = String(decompressedData)
                    println("第 $i 次迭代完成 - 压缩后大小: ${compressedData.size} 字节, 数据一致性: ${testData == result}")
                }
            }
        }

        println("总共执行时间: ${totalTime} 毫秒")
        println("平均每次迭代时间: ${totalTime.toDouble() / iterations} 毫秒")
    }

    fun compress(data: ByteArray): ByteArray {
        val outputStream = ByteArrayOutputStream()
        GZIPOutputStream(outputStream).use { gzip ->
            gzip.write(data)
            gzip.finish()
        }
        return outputStream.toByteArray()
    }

    fun decompress(data: ByteArray): ByteArray {
        val inputStream = ByteArrayInputStream(data)
        val outputStream = ByteArrayOutputStream()
        GZIPInputStream(inputStream).use { gzip ->
            outputStream.write(gzip.readBytes())
        }
        return outputStream.toByteArray()
    }
}
